www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/GameLib/Graphics/Font.cpp

    //Download by http://www.NewXing.com
/////////////////
// Font.h		:	设置字体
//
// 版本0010		:	二零零三年七月四日
//
// written by	:	Huang LunXin
//
// Compiler		:	Visual C++ 6.0
//
// Copyright	:	IcePoint  2003
/////////////////
// 此文件用来设置字体
#include "Font.h"
#include "..\\define.h"
#include "..\\globle_func.h"

CFont::CFont()
{
	m_font=NULL;
	m_fontHeight=0;
}

CFont::~CFont()
{

}
void CFont::Init()
{
	m_font=NULL;
	m_fontSave=NULL;
	m_fontHeight=0;
}
bool CFont::UseFont(HDC hdc,int iFontStyle,int iSize,int nWeight,bool bItalic,bool bUnderline)
{
	
	switch(iFontStyle)
	{
	case DCF_TITLE:
		m_font=CreateFont(128,0,0,0,						 
							800,					 
							TRUE,					 
							FALSE,				 
							0, 
							GB2312_CHARSET, 
							OUT_DEFAULT_PRECIS, 
							CLIP_DEFAULT_PRECIS, 
							DEFAULT_QUALITY, 
							DEFAULT_PITCH|FF_SWISS, 
							"宋体"); 
		break;
	case DCF_USERDEFINE:
		m_fontHeight=iSize;
		m_font=CreateFont(iSize,0,0,0,
							nWeight,
							bItalic,
							bUnderline,
							0,
							GB2312_CHARSET, 
							OUT_DEFAULT_PRECIS, 
							CLIP_DEFAULT_PRECIS, 
							DEFAULT_QUALITY, 
							DEFAULT_PITCH|FF_SWISS, 
							"宋体"); 
		break;
	case DCF_NOMAL:
	default:
		m_font=CreateFont(16,0,0,0,
							400,
							FALSE,
							FALSE,
							0,
							GB2312_CHARSET, 
							OUT_DEFAULT_PRECIS, 
							CLIP_DEFAULT_PRECIS, 
							PROOF_QUALITY, 
							DEFAULT_PITCH|FF_SWISS, 
							"宋体"); 
		break;
	}
	if(!m_font)
	{
		MsgBox("Create Font Failed!");
		return false;
	}
	m_fontSave=(HFONT)::SelectObject(hdc,m_font);
	return true;
}
void CFont::RestoreFont(HDC hdc)
{
	::DeleteObject(::SelectObject(hdc,m_fontSave));
}
int CFont::GetFontHeight(int iFontStyle)
{
	switch(iFontStyle)
	{
	case DCF_TITLE:
		return 80;
		break;
	case DCF_USERDEFINE:
		return m_fontHeight;
		break;
	case DCF_NOMAL:
	default:
		return 16;
		break;
	}
	return 0;
}

/*

void CIme::lpList()
{
	DisableIme();	// 通过DisableIme初始化一些数据
}
CIme::~CIme()
{
	DisableIme();
	if( lpList() )
	{
		free( (HANDLE)lpStandardList );
		lpStandardList = NULL;
	}

}


void CIme::DisableIme()
{
		while( ImmIsIME( GetKeyboardLayout( 0 )))
			ActivateKeyboardLayout(( HKL )HKL_NEXT, 0 );	// 如果IME打开通过循环切换到下一个关闭
		bImeIsAble = false;
		szConvertedStr[ 0 ] = 0;
		szInputStr[ 0 ] = 0;
		nImeCursor = 0;
		szImeName[ 0 ] = 0;
		szSelectList[ 0 ] = 0; 
}
void CIme::EnableIme()
{
	bImeIsAble = true;
}

void CIme::NextIme()
{
	if( !bImeIsAble )
		return;
	ActivateKeyboardLayout(( HKL )HKL_NEXT, 0 );
}

void CIme::SharpIme( HWND hWnd )
{
	ImmSimulateHotKey( hWnd, IME_CHOTKEY_SHAPE_TOGGLE );
}

void CIme::SymbolIme( HWND hWnd )
{
	ImmSimulateHotKey( hWnd, IME_CHOTKEY_SYMBOL_TOGGLE );
}

void CIme::ConvertList( CANDIDATELIST *pList, char *pszList )
{
// 转换CandidateList到一个串,\t分隔每一项
	unsigned int i;
	if( pList->dwCount < pList->dwSelection )
	{
		pszList[ 0 ] = 0;
		return;
	}
	for( i = 0; ( i < pList->dwCount - pList->dwSelection )&&( i < pList->dwPageSize ); i++ )
	{
		*pszList++ = ( i % 10 != 9 )? i % 10 + '1' : '0';	// 每项对应的数字键
		*pszList++ = '.';	// 用'.'分隔
		strcpy( pszList, (char*)pList + pList->dwOffset[ pList->dwSelection + i ] );	// 每项实际的内容
		pszList += strlen( pszList );
		*pszList++ = '\t';	// 项之间以'\t'分隔
	}
	*( pszList - 1 )= 0;	// 串尾,并覆盖最后一个'\t'
}

bool CIme::OnWM_INPUTLANGCHANGEREQUEST()
{
	return !bImeIsAble;		// 如果禁止IME则返回false,此时窗口函数应返回0,否则DefWindowProc会打开输入法
}

bool CIme::OnWM_INPUTLANGCHANGE( HWND hWnd )
{
// IME改变
	HKL hKL = GetKeyboardLayout( 0 );
	if( ImmIsIME( hKL ))
	{
		HIMC hIMC = ImmGetContext( hWnd );
		ImmEscape( hKL, hIMC, IME_ESC_IME_NAME, szImeName );	// 取得新输入法名字
		DWORD dwConversion, dwSentence;
		ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence );
		bImeSharp = ( dwConversion & IME_CMODE_FULLSHAPE )? true : false;	// 取得全角标志
		bImeSymbol = ( dwConversion & IME_CMODE_SYMBOL )? true : false;	// 取得中文标点标志
		ImmReleaseContext( hWnd, hIMC );
	}
	else			// 英文输入
		szImeName[ 0 ] = 0;
	return false;	// 总是返回false,因为需要窗口函数调用DefWindowProc继续处理
}

bool CIme::OnWM_IME_NOTIFY( HWND hWnd, WPARAM wParam )
{
	HIMC hIMC;
	DWORD dwSize;
	DWORD dwConversion, dwSentence;

	switch( wParam )
	{
	case IMN_SETCONVERSIONMODE:	// 全角/半角,中/英文标点改变
		hIMC = ImmGetContext( hWnd );
		ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence );
		bImeSharp = ( dwConversion & IME_CMODE_FULLSHAPE )? true : false;
		bImeSymbol = ( dwConversion & IME_CMODE_SYMBOL )? true : false;
		ImmReleaseContext( hWnd, hIMC );
		break;

	case IMN_OPENCANDIDATE:		// 进入选字状态
	case IMN_CHANGECANDIDATE:	// 选字表翻页
		hIMC = ImmGetContext( hWnd );
		if( lpList )
		{
			GlobalFree( (HANDLE)lpList );
			lpList = NULL;
		}	// 释放以前的选字表
		if( dwSize = ImmGetCandidateList( hIMC, 0, NULL, 0 ))
		{
			lpList = (LPCANDIDATELIST)GlobalAlloc( GPTR, dwSize );
			if( lpList )
				ImmGetCandidateList( hIMC, 0, lpList, dwSize );
		}	// 得到新的选字表
		ImmReleaseContext( hWnd, hIMC );
		if( lpList )
			ConvertList( lpList, szSelectList );	// 选字表整理成串
		break;

	case IMN_CLOSECANDIDATE:	// 关闭选字表
		if( lpList )
		{
			GlobalFree( (HANDLE)lpList );
			lpList = NULL;
		}	// 释放
		szSelectList[ 0 ] = 0;
		break;
	}
	return true;	// 总是返回true,防止IME窗口打开
}

bool CIme::OnWM_IME_COMPOSITION( HWND hWnd, LPARAM lParam )
{
// 输入改变
	HIMC hIMC;
	DWORD dwSize;
	hIMC = ImmGetContext( hWnd );
	if( lParam & GCS_COMPSTR )
	{
		dwSize = ImmGetCompositionString( hIMC, GCS_COMPSTR, (void*)szConvertedStr, sizeof( szConvertedStr ));
		szConvertedStr[ dwSize ] = 0;
	}	// 取得szCompStr
	if( lParam & GCS_COMPREADSTR )
	{
		dwSize = ImmGetCompositionString( hIMC, GCS_COMPREADSTR, (void*)szInputStr, sizeof( szInputStr ));
		szInputStr[ dwSize ] = 0;
	}	// 取得szCompReadStr
	if( lParam & GCS_CURSORPOS )
	{
		nImeCursor = 0xffff & ImmGetCompositionString( hIMC, GCS_CURSORPOS, NULL, 0 );
	}	// 取得nImeCursor
	if( lParam & GCS_RESULTSTR )
	{
		unsigned char str[ MAX_PATH ];
		dwSize = ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void*)str, sizeof( str )); // 取得汉字输入串
		str[ dwSize ] = 0;
		unsigned char *p = str;

		while( *p )PostMessage( hWnd, WM_CHAR, (WPARAM)(*p++), 1 );	// 转成WM_CHAR消息
	}
	ImmReleaseContext( hWnd, hIMC );
	return true;	// 总是返回true,防止IME窗口打开
}

char* CIme::GetImeName()
{
	return szImeName[ 0 ]? szImeName : NULL;
}

bool CIme::IfImeSharp()
{
// 是否全角
	return bImeSharp;
}

bool CIme::IfImeSymbol()
{
// 是否中文标点
	return bImeSymbol;
}

void CIme::GetImeInput( char **pszCompStr, char **pszCompReadStr, int *pnImeCursor, char **pszCandList )
{
	if( pszCompStr )		*pszCompStr = szConvertedStr;
	if( pszCompReadStr )	*pszCompReadStr = szInputStr;
	if( pnImeCursor )		*pnImeCursor = nImeCursor;
	if( pszCandList )		*pszCandList = szSelectList;
}

*/